﻿using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using Virvar.Net;

namespace Virvar.TCPServer
{
    class ClientHandler
    {
        // список всех подключенных клиентов
        static List<ClientHandler> clients = new List<ClientHandler>();
        // клиент обработчика, нужен только для закрытия
        public TcpClient tcpClient;
        static Encoding enc = Encoding.Default;
        IMessager messager;
        // id клиента
        int clientId;

        public ClientHandler(TcpClient tcpClient)
        {
            this.tcpClient = tcpClient;
            clients.Add(this);
            messager = new Messager(tcpClient.GetStream());
            // на случай с шифрованием
            //decryptor = new Decryptor(enc);
        }

        public void Run()
        {
            // здесь должна быть верификация пользователя

            Console.WriteLine("Someone connected.");

            while (true)
            {
                byte[] message = messager.Receive();
                if (message.Length == 0)
                    break;
                Console.WriteLine(enc.GetString(message));
                Shout(message);
            }

            CloseClient();
        }

        // сообщение только конкретному пользователю (шёпот)
        private static void Wisper(ClientHandler client, byte[] msg)
        {
            client.messager.Send(msg);
        }

        private static void Shout(byte[] msg)
        {
            // был раньше синхронизированным, стоит подумать над этим
            foreach (ClientHandler client in clients)
            {
                client.messager.Send(msg);
            }
        }

        private void CloseClient()
        {
            tcpClient.Close();
            clients.Remove(this);
            // пользователь вышел
        }

        internal static void DisconnectAll()
        {
            foreach (ClientHandler client in clients)
            {
                client.messager.Close();
                client.tcpClient.Close();
            }
        }
    }
}
